package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.blog.cmrpersonalblog.entity.UserAnnouncementRead;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户公告阅读记录Mapper接口
 */
@Mapper
public interface UserAnnouncementReadMapper extends BaseMapper<UserAnnouncementRead> {

    /**
     * 批量插入阅读记录
     * @param readRecords 阅读记录列表
     * @return 影响行数
     */
    int insertBatch(@Param("readRecords") List<UserAnnouncementRead> readRecords);

    /**
     * 查询用户已读的公告ID列表
     * @param userId 用户ID
     * @param announcementIds 公告ID列表
     * @return 已读的公告ID列表
     */
    List<Long> selectReadAnnouncementIds(@Param("userId") Long userId, 
                                        @Param("announcementIds") List<Long> announcementIds);

    /**
     * 查询用户未读的公告数量
     * @param userId 用户ID
     * @param targetAudience 目标受众
     * @return 未读公告数量
     */
    int countUnreadAnnouncements(@Param("userId") Long userId, 
                                @Param("targetAudience") String targetAudience);

    /**
     * 标记用户已读所有公告
     * @param userId 用户ID
     * @param targetAudience 目标受众
     * @return 影响行数
     */
    int markAllAsRead(@Param("userId") Long userId, 
                     @Param("targetAudience") String targetAudience);

    /**
     * 清理过期的阅读记录
     * @param beforeTime 时间点之前的记录
     * @return 影响行数
     */
    int cleanExpiredReadRecords(@Param("beforeTime") LocalDateTime beforeTime);

    /**
     * 根据公告ID删除阅读记录
     * @param announcementId 公告ID
     * @return 影响行数
     */
    int deleteByAnnouncementId(@Param("announcementId") Long announcementId);

    /**
     * 根据用户ID删除阅读记录
     * @param userId 用户ID
     * @return 影响行数
     */
    int deleteByUserId(@Param("userId") Long userId);

    /**
     * 标记公告为已忽略
     * @param userId 用户ID
     * @param announcementId 公告ID
     * @return 影响行数
     */
    int markAsIgnored(@Param("userId") Long userId,
                     @Param("announcementId") Long announcementId);

    /**
     * 取消忽略公告（删除忽略记录）
     * @param userId 用户ID
     * @param announcementId 公告ID
     * @return 影响行数
     */
    int cancelIgnore(@Param("userId") Long userId,
                    @Param("announcementId") Long announcementId);

    /**
     * 查询用户已忽略的公告ID列表
     * @param userId 用户ID
     * @return 已忽略的公告ID列表
     */
    List<Long> selectIgnoredAnnouncementIds(@Param("userId") Long userId);
}
